diff -Naur keen.orig/src/Makefile.lnx keen/src/Makefile.lnx
--- keen.orig/src/Makefile.lnx	2005-11-09 22:27:50.000000000 -0500
+++ keen/src/Makefile.lnx	2010-03-26 03:06:24.000000000 -0400
@@ -31,6 +31,7 @@
           sdl/keydrv.o sdl/snddrv.o sdl/timedrv.o sdl/viddrv.o \
 	  scale2x/scalebit.o scale2x/scale2x.o scale2x/scale3x.o \
 	  scale2x/pixel.o \
+	  unix_fopen_wrapper.o \
 	  keen.h keenext.h sounds.h funcdefs.h latch.h game.h
 	gcc -g3 -o keen \
           main.o fileio.o \
@@ -51,6 +52,7 @@
           sdl/keydrv.o sdl/snddrv.o sdl/timedrv.o sdl/viddrv.o \
 	  scale2x/scalebit.o scale2x/scale2x.o scale2x/scale3x.o \
 	  scale2x/pixel.o \
+	  unix_fopen_wrapper.o \
 	  `sdl-config --libs`
 
 
diff -Naur keen.orig/src/keen.h keen/src/keen.h
--- keen.orig/src/keen.h	2005-11-07 16:39:12.000000000 -0500
+++ keen/src/keen.h	2010-03-26 03:06:24.000000000 -0400
@@ -14,6 +14,10 @@
   #include <windows.h>
 #endif
 
+#ifdef TARGET_LNX
+  #include "unix_fopen_wrapper.h"
+#endif
+
 #include "sounds.h"
 #include "funcdefs.h"
 #include "latch.h"
diff -Naur keen.orig/src/main.c keen/src/main.c
--- keen.orig/src/main.c	2005-11-09 23:35:10.000000000 -0500
+++ keen/src/main.c	2010-03-26 03:11:56.000000000 -0400
@@ -75,7 +75,7 @@
 
 char loadinggame, loadslot;
 
-FILE *log=NULL;
+/* FILE *log=NULL; */
 
 stFade fade;
 stMap map;
@@ -161,7 +161,7 @@
   SetDefaultOptions();
   setoption(OPT_FULLSCREEN, "SDL Fullscreen Mode", 0);
   setoption(OPT_ZOOM, "Image Zoom", 1);
-  setoption(OPT_FRAMESKIP, "Frameskip", 2);
+  setoption(OPT_FRAMESKIP, "Frameskip", 1);
 
   /* process command line options */
   VidDrv_printf("Processing command-line options.\n");
@@ -180,6 +180,7 @@
       {
         numplayers = 2;
       }
+		/*
       else if (strcmp(tempbuf, "-3player")==0)
       {
         numplayers = 3;
@@ -188,6 +189,7 @@
       {
         numplayers = 4;
       }
+		*/
       else if (strcmp(tempbuf, "-single")==0)
       {
         numplayers = 1;
@@ -240,6 +242,7 @@
       {
         showfps = 1;
       }
+		/*
       else if (strcmp(tempbuf, "-host")==0)     // start network server
       {
         is_server = 1;
@@ -250,6 +253,7 @@
         is_client = 1;
         localmp = 0;
       }
+		*/
       else if (i!=1 || atoi(argv[i])==0)
       {
         VidDrv_printf("Wait a minute...what the hell does '%s' mean?\n",tempbuf);
diff -Naur keen.orig/src/misc.c keen/src/misc.c
--- keen.orig/src/misc.c	2005-11-16 20:04:28.000000000 -0500
+++ keen/src/misc.c	2010-03-26 03:15:46.000000000 -0400
@@ -1103,7 +1103,7 @@
 {
   VidDrv_printf("Usage: keen [lvlnum] [-*player] [-nopk] [-ep*] [-dtm] [-nocheat] [-rec] -[eseq]\n\n");
   VidDrv_printf("lvlnum          specify a level number (such as 2) to go directly to that level\n");
-  VidDrv_printf("-*player        select number of players (1-4); defaults to 1\n");
+  VidDrv_printf("-*player        select number of players (1-2); defaults to 1\n");
   VidDrv_printf("-nopk           do not allow players to kill each other in multiplayer games\n");
   VidDrv_printf("-ep*            select episode 1, 2, or 3; defaults to 1\n");
   VidDrv_printf("-dtm            go directly to the world map, bypassing intro and title screen\n");
diff -Naur keen.orig/src/sdl/viddrv.c keen/src/sdl/viddrv.c
--- keen.orig/src/sdl/viddrv.c	2005-11-16 20:08:30.000000000 -0500
+++ keen/src/sdl/viddrv.c	2010-03-26 03:06:24.000000000 -0400
@@ -29,8 +29,10 @@
 
 SDL_Rect dstrect;
 
+#ifndef TARGET_LNX
 extern FILE *log;
 #define CKLOGFILENAME            "ck.log"
+#endif
 
 #define MAX_CONSOLE_MESSAGES     3
 #define CONSOLE_MESSAGE_X        3
@@ -222,11 +224,11 @@
 // applies all changes to the palette made with pal_set
 void pal_apply(void)
 {
-  SDL_SetColors(screen, &MyPalette, 0, 256);
-  SDL_SetColors(ScrollSurface, &MyPalette, 0, 256);
+  SDL_SetColors(screen, MyPalette, 0, 256);
+  SDL_SetColors(ScrollSurface, MyPalette, 0, 256);
   if (blitsurface_alloc)
   {
-    SDL_SetColors(BlitSurface, &MyPalette, 0, 256);
+    SDL_SetColors(BlitSurface, MyPalette, 0, 256);
   }
 }
 
@@ -338,9 +340,9 @@
 // shuts down the video driver
 void VidDrv_Stop(void)
 {
-  if(screen) { SDL_FreeSurface(screen); VidDrv_printf("freed screen\n"); }
-  if(ScrollSurface) { SDL_FreeSurface(ScrollSurface); VidDrv_printf("freed scrollsurface\n"); }
-  if(blitsurface_alloc) { blitsurface_alloc = 0; SDL_FreeSurface(BlitSurface); VidDrv_printf("freed blitsurface\n"); }
+  if(screen) { SDL_FreeSurface(screen); screen = NULL; VidDrv_printf("freed screen\n"); }
+  if(ScrollSurface) { SDL_FreeSurface(ScrollSurface); ScrollSurface = NULL; VidDrv_printf("freed scrollsurface\n"); }
+  if(blitsurface_alloc) { blitsurface_alloc = 0; SDL_FreeSurface(BlitSurface); BlitSurface = NULL; VidDrv_printf("freed blitsurface\n"); }
 }
 
 // resets graphics to allow changing of resolution or zoom settings
@@ -365,10 +367,12 @@
 // SDL-specific, not win32-specific)
 void VidDrv_InitConsole(void)
 {
+#ifndef TARGET_LNX
 FILE *fp;
   // erase contents of log file
   fp = fopen(CKLOGFILENAME, "wb");
   fclose(fp);
+#endif
 }
 
 void VidDrv_printf(const char *str, ...)
diff -Naur keen.orig/src/unix_fopen_wrapper.c keen/src/unix_fopen_wrapper.c
--- keen.orig/src/unix_fopen_wrapper.c	1969-12-31 19:00:00.000000000 -0500
+++ keen/src/unix_fopen_wrapper.c	2010-03-26 03:06:24.000000000 -0400
@@ -0,0 +1,123 @@
+
+/* semi-case-insensitive fopen() replacement.
+
+Usage:
+
+#include "unix_fopen_wrapper.h"
+FILE *foo = fopen("bar.baz", "rb");
+
+fopen() gets redefined to unix_fopen() in the header file.
+unix_fopen() attempts to call the real fopen() on:
+
+bar.baz
+BAR.baz
+Bar.baz
+bar.BAZ
+BAR.BAZ
+Bar.BAZ
+bar.Baz
+BAR.Baz
+Bar.Baz
+
+It'll still miss e.g. baR.baz or bAr.baz
+
+If there's no . in the filename (e.g. "bar"), just check
+for bar, BAR, Bar
+*/
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <limits.h>
+
+void lcase_all(char *c) {
+	if(!c || !*c) return;
+	while(*c && *c != '.') {
+		*c = tolower(*c);
+		c++;
+	}
+}
+
+void ucase_all(char *c) {
+	if(!c || !*c) return;
+	while(*c && *c != '.') {
+		*c = toupper(*c);
+		c++;
+	}
+}
+
+void ucase_first(char *c) {
+	if(!c || !*c) return;
+	lcase_all(c);
+	c[0] = toupper(c[0]);
+}
+
+FILE *unix_fopen(const char *path, const char *mode) {
+	FILE *result;
+	char realpath[PATH_MAX], *name, *ext;
+
+/* #define DEBUG_FOPEN */
+
+#ifdef DEBUG_FOPEN
+#define TRY_FOPEN(p, m) { \
+	result = fopen(p, m); \
+	fprintf(stderr, "-- %s:%d: (%s,%s): %s\n", \
+			__FILE__, __LINE__, p, m, (result ? "OK" : "fail")); \
+	if(result) return result; \
+}
+#else
+#define TRY_FOPEN(p, m) { if( (result = fopen(p, m)) ) return result; }
+#endif
+
+	/* try it as-is first */
+	TRY_FOPEN(path, mode);
+
+	/* parse into name and (possible) extension */
+	strcpy(realpath, path);
+	ext = strrchr(realpath, '.');
+	if(ext) {
+		++ext;
+		if(!ext[0]) ext = NULL;
+	}
+
+	/* skip any directory component(s) */
+	name = strrchr(realpath, '/');
+	if(!name) name = realpath;
+
+	/* permutations... */
+	lcase_all(ext);
+	lcase_all(name);
+	TRY_FOPEN(realpath, mode);
+
+	ucase_all(name);
+	TRY_FOPEN(realpath, mode);
+
+	ucase_first(name);
+	TRY_FOPEN(realpath, mode);
+
+	ucase_all(ext);
+	lcase_all(name);
+	TRY_FOPEN(realpath, mode);
+
+	ucase_all(name);
+	TRY_FOPEN(realpath, mode);
+
+	ucase_first(name);
+	TRY_FOPEN(realpath, mode);
+
+	ucase_first(ext);
+	lcase_all(name);
+	TRY_FOPEN(realpath, mode);
+
+	ucase_all(name);
+	TRY_FOPEN(realpath, mode);
+
+	ucase_first(name);
+	TRY_FOPEN(realpath, mode);
+
+#ifdef DEBUG_FOPEN
+	fprintf(stderr, "%s:%s: TRY_FOPEN(%s,%s): Giving up",
+			__FILE__, __LINE__, path, mode);
+#endif
+	return NULL;
+}
diff -Naur keen.orig/src/unix_fopen_wrapper.h keen/src/unix_fopen_wrapper.h
--- keen.orig/src/unix_fopen_wrapper.h	1969-12-31 19:00:00.000000000 -0500
+++ keen/src/unix_fopen_wrapper.h	2010-03-26 03:06:24.000000000 -0400
@@ -0,0 +1,2 @@
+FILE *unix_fopen(const char *path, const char *mode);
+#define fopen(x,y) unix_fopen(x,y)
